認識 Git 之前首先要介紹幾個簡單的 Terminal 指令
Windows | MacOS/Linux | 功能 |
---|---|---|
cd | cd | 切換目錄 |
cd | pwd | 顯示目前所在資料夾 |
dir | ls | 目前資料夾的檔案列表 |
md | mkdir | 創建資料夾 |
type nul> | touch | 建立檔案 |
copy | cp | 複製檔案 |
move | mv | 移動檔案 |
del | rm | 刪除檔案 |
cls | clear | 清除Terminal內容 |
※各個終端機指令皆有差異,Git Bash 操作方式與 Mac 較相同
$ cd ..
// 回到上一層
$ cd test
// 移動到下一層的 test 資料夾
$ md test
// 建立 test 資料夾
$ type nul> test.txt
// 建立 test.txt 檔案
$ copy test.txt test2.txt
// 複製 test.txt 後建立一檔案為 test2.txt
$ move test.txt aa\bb.txt
// 將 test.txt 移動至 aa 資料夾內,並改名為 bb.txt
$ del test.txt
// 刪除 test.txt 檔案
使用 Git 前必須要先設定使用者與 Email 才可以使用,所以我們先在全域設定
$ git config --global user.name "你的使用者名稱"
$ git config --global user.email "你的Email"
$ git config --list
// 查看設定
設定完成後開啟專案資料夾,輸入以下指令進行
$ git init
初始化後會在資料夾內新增一個 .git 資料夾,版本控管文件都存於此資料夾內,如果刪除此資料夾就無法再次復原檔案了!
我們先來看一下 Git 的架構,共分為工作區、暫存區、本地端檔案庫與遠端檔案庫,前三個皆在本地端進行,只有最後一個是在遠端的 Server 進行
HEAD
:目前檔案比對的基準,也就是目前所在的 commit 位置master
:預設的分支名稱.gitignore
:此檔案內設定的檔案名稱不受 git 的控管-f
:在指令後方加上 -f
可以強制執行該指令@
:可以代替指令中的 HEAD
首先介紹幾個比較常用的指令
$ git status
// 觀看目前資料夾狀態
$ git add .
// 將所有檔案加入暫存區
$ git commit -m "git init"
// 將暫存區的檔案進行 commit,-m 後面為 commit 的訊息
$ git commit --amend -m "git init again"
// 修改最後一次 commit 的訊息
$ git commit --amend --no-edit
// 將暫存區的檔案併入最後一次 commit
$ git log
// 查詢所有 commit 紀錄
$ git log -p
// 參數 -p 顯示 commit 詳細資訊
$ git log --oneline --graph
// 參數 --oneline 顯示更精簡的 commit 紀錄
// 參數 --graph 顯示 commit 線圖
$ git log --all
// 參數 --all 顯示包含 branch 的紀錄
再來是比較不常用到的指令
$ git reset index.html
// 將 index.html 取消加入暫存區
$ git add -u
// 將有 commit 過且修改的檔案放入暫存區
$ git show HashID
// 查看某次 commit 與它上一版的差異細節(沒有輸入 HashID 預設為最後一次 commit)
$ git cat-file -p HashID
// 查看 HashID 的內容,HashID 至少四碼以上
$ git blame 檔案名稱
// 查看檔案內容 commit 的時間點與作者
$ git diff
// 查看檔案差異
diff
是比較少用的指令,在檢查檔案差異時可使用,使用方法如圖
Git 提供我們在全域設定縮寫,可以將常輸入的指令記錄下來,可以少打一些字
詳細設定可在 git config --list
內檢視
$ git config --global alias.co checkout
// 設定 checkout 縮寫為 co
$ git config --global alias.ci commit
// 設定 commit 縮寫為 ci
$ git config --global alias.st status
// 設定 status 縮寫為 st
$ git config --global alias.br branch
// 設定 branch 縮寫為 br
還原總共分為三種,分別是 revert
、checkout
與 reset
$ git revert HashID -n
// 復原 commit 並自動加一個 commit,加上 -n 則不會自動 commit
$ git checkout index.html
// 將 index.html 檔案還原至暫存區的狀態,暫存區沒有則還原至 HEAD
reset HEAD^
$ git reset --hard
// 將檔案還原至 HEAD 的狀態,並清除暫存區
$ git reset HashID --hard
// 重設 HEAD 到某個 commit 並清除暫存區
$ git reset --mixed
// 清除暫存區,但工作目錄不變
$ git reset HashID --mixed
// 清除暫存區,重設 HEAD 到某個 commit,但工作目錄不變
$ git reflog
// 查看 HEAD 的移動紀錄
指令 | 工作目錄 | 暫存區 | HEAD | 分支 | 備註 |
---|---|---|---|---|---|
revert | 重設 | 重設 | 往前 | 不變 | 新增 commit |
revert -n | 重設 | 不變 | 不變 | 不變 | |
checkout 檔案 | 重設 | 不變 | 不變 | 不變 | |
checkout 分支/commit | 重設 | 不變 | 重設 | 不變 | |
reset --hard | 重設 | 重設 | 重設 | 重設 | |
reset --mixed | 不變 | 重設 | 重設 | 重設 | |
reset --soft | 不變 | 不變 | 重設 | 重設 |
$ git branch
// 查看所有分支
$ git branch 分支名稱
// 新增分支
$ git branch 分支名稱 -d
// 刪除分支,使用 -D 可強制刪除
$ git checkout 分支名稱
// 將HEAD移動到該分支
$ git checkout -b 分支名稱
// 新增分支並切換HEAD
$ git branch -m index index2
// 修改分支名稱,將 index 分支修改為 index2
checkout 會將原本分支的異動套用到新分支,若新分支有其他修改導致無法套用,則無法切換分支
$ git stash save index
// 將檔案收藏為index
$ git stash list
// 收藏列表
$ git stash pop
// 取出最後一個收藏
$ git merge dev
// 將 dev 合併到目前分支 (使用快進合併)
$ git merge dev --no-ff
// 將 dev 合併到目前分支 (不使用快進合併)
快進合併的意思是,只需移動分支即可完成合併,不使用快進合併則會產生一個 commit
(merge 預設是使用快進合併)
遇到衝突通常都是因為兩個人一起 commit 同一個部分,此時則須兩人一起討論需如何修改,最後將不必要的部分刪除,將檔案加入暫存區,並再次 commit ,然後新增訊息或 :q 離開~
假設我們要將 dev 分支合併到 mester,則先切換到 dev,然後輸入指令
$ git rebase master
同上面,先將不必要的部分刪除,將檔案加入暫存區,並輸入以下指令
$ git rebase --continue
這時分支就合併完成了,並且也變成了一條線拉~
$ git tag "v4.0" HashID
// 在該 HashID 上貼上 v4.0的標籤
$ git tag -a "v4.0" -m "update"
// 在目前 HEAD 上貼上 v4.0的標籤,訊息為 update
$ git tag -d "v4.0"
// 刪除 v4.0 標籤
$ git cat-file -p "v4.0"
// 查看 v4.0 標籤的訊息
$ git init --bare
// 建立遠端檔案庫
$ git remote add origin 路徑
// 將本地端的檔案庫連結至遠端
$ git remote show origin
// 查看檔案庫資訊
$ git ls-remote 路徑
// 查看遠端分支
$ git fetch
// 抓取遠端 commit 紀錄
$ git merge origin/master
// 將本地端合併遠端分支
$ git branch -u origin/master master
// 將遠端的 master 設定為預設分支
$ git pull
// 等於 fetch + merge
$ git romote remove origin
// 刪除遠端檔案庫
$ git clone 路徑 資料夾名稱
// 複製遠端資料
$ git push
// 將分支推送至遠端,加上 -f 可以強制推送
$ git clean -f
// 把沒有版控的檔案刪除
$ git gc
// 清理沒有用到的 Object